1 /*
2 * Copyright (C) 2007 The Guava Authors
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 package com.google.common.collect;
18
19 import static com.google.common.base.Preconditions.checkArgument;
20 import static com.google.common.base.Preconditions.checkNotNull;
21 import static com.google.common.collect.CollectPreconditions.checkRemove;
22
23 import com.google.common.annotations.Beta;
24 import com.google.common.annotations.GwtCompatible;
25 import com.google.common.base.Function;
26 import com.google.common.base.Optional;
27 import com.google.common.base.Predicate;
28
29 import java.util.Collection;
30 import java.util.Comparator;
31 import java.util.Iterator;
32 import java.util.List;
33 import java.util.NoSuchElementException;
34 import java.util.Queue;
35 import java.util.RandomAccess;
36 import java.util.Set;
37
38 import javax.annotation.Nullable;
39
40 /**
41 * This class contains static utility methods that operate on or return objects
42 * of type {@code Iterable}. Except as noted, each method has a corresponding
43 * {@link Iterator}-based method in the {@link Iterators} class.
44 *
45 * <p><i>Performance notes:</i> Unless otherwise noted, all of the iterables
46 * produced in this class are <i>lazy</i>, which means that their iterators
47 * only advance the backing iteration when absolutely necessary.
48 *
49 * <p>See the Guava User Guide article on <a href=
50 * "http://code.google.com/p/guava-libraries/wiki/CollectionUtilitiesExplained#Iterables">
51 * {@code Iterables}</a>.
52 *
53 * @author Kevin Bourrillion
54 * @author Jared Levy
55 * @since 2.0 (imported from Google Collections Library)
56 */
57 @GwtCompatible(emulated = true)
58 public final class Iterables {
59 private Iterables() {}
60
61 /** Returns an unmodifiable view of {@code iterable}. */
62 public static <T> Iterable<T> unmodifiableIterable(
63 final Iterable<T> iterable) {
64 checkNotNull(iterable);
65 if (iterable instanceof UnmodifiableIterable ||
66 iterable instanceof ImmutableCollection) {
67 return iterable;
68 }
69 return new UnmodifiableIterable<T>(iterable);
70 }
71
72 /**
73 * Simply returns its argument.
74 *
75 * @deprecated no need to use this
76 * @since 10.0
77 */
78 @Deprecated public static <E> Iterable<E> unmodifiableIterable(
79 ImmutableCollection<E> iterable) {
80 return checkNotNull(iterable);
81 }
82
83 private static final class UnmodifiableIterable<T> extends FluentIterable<T> {
84 private final Iterable<T> iterable;
85
86 private UnmodifiableIterable(Iterable<T> iterable) {
87 this.iterable = iterable;
88 }
89
90 @Override
91 public Iterator<T> iterator() {
92 return Iterators.unmodifiableIterator(iterable.iterator());
93 }
94
95 @Override
96 public String toString() {
97 return iterable.toString();
98 }
99 // no equals and hashCode; it would break the contract!
100 }
101
102 /**
103 * Returns the number of elements in {@code iterable}.
104 */
105 public static int size(Iterable<?> iterable) {
106 return (iterable instanceof Collection)
107 ? ((Collection<?>) iterable).size()
108 : Iterators.size(iterable.iterator());
109 }
110
111 /**
112 * Returns {@code true} if {@code iterable} contains any object for which {@code equals(element)}
113 * is true.
114 */
115 public static boolean contains(Iterable<?> iterable, @Nullable Object element) {
116 if (iterable instanceof Collection) {
117 Collection<?> collection = (Collection<?>) iterable;
118 return Collections2.safeContains(collection, element);
119 }
120 return Iterators.contains(iterable.iterator(), element);
121 }
122
123 /**
124 * Removes, from an iterable, every element that belongs to the provided
125 * collection.
126 *
127 * <p>This method calls {@link Collection#removeAll} if {@code iterable} is a
128 * collection, and {@link Iterators#removeAll} otherwise.
129 *
130 * @param removeFrom the iterable to (potentially) remove elements from
131 * @param elementsToRemove the elements to remove
132 * @return {@code true} if any element was removed from {@code iterable}
133 */
134 public static boolean removeAll(
135 Iterable<?> removeFrom, Collection<?> elementsToRemove) {
136 return (removeFrom instanceof Collection)
137 ? ((Collection<?>) removeFrom).removeAll(checkNotNull(elementsToRemove))
138 : Iterators.removeAll(removeFrom.iterator(), elementsToRemove);
139 }
140
141 /**
142 * Removes, from an iterable, every element that does not belong to the
143 * provided collection.
144 *
145 * <p>This method calls {@link Collection#retainAll} if {@code iterable} is a
146 * collection, and {@link Iterators#retainAll} otherwise.
147 *
148 * @param removeFrom the iterable to (potentially) remove elements from
149 * @param elementsToRetain the elements to retain
150 * @return {@code true} if any element was removed from {@code iterable}
151 */
152 public static boolean retainAll(
153 Iterable<?> removeFrom, Collection<?> elementsToRetain) {
154 return (removeFrom instanceof Collection)
155 ? ((Collection<?>) removeFrom).retainAll(checkNotNull(elementsToRetain))
156 : Iterators.retainAll(removeFrom.iterator(), elementsToRetain);
157 }
158
159 /**
160 * Removes, from an iterable, every element that satisfies the provided
161 * predicate.
162 *
163 * @param removeFrom the iterable to (potentially) remove elements from
164 * @param predicate a predicate that determines whether an element should
165 * be removed
166 * @return {@code true} if any elements were removed from the iterable
167 *
168 * @throws UnsupportedOperationException if the iterable does not support
169 * {@code remove()}.
170 * @since 2.0
171 */
172 public static <T> boolean removeIf(
173 Iterable<T> removeFrom, Predicate<? super T> predicate) {
174 if (removeFrom instanceof RandomAccess && removeFrom instanceof List) {
175 return removeIfFromRandomAccessList(
176 (List<T>) removeFrom, checkNotNull(predicate));
177 }
178 return Iterators.removeIf(removeFrom.iterator(), predicate);
179 }
180
181 private static <T> boolean removeIfFromRandomAccessList(
182 List<T> list, Predicate<? super T> predicate) {
183 // Note: Not all random access lists support set() so we need to deal with
184 // those that don't and attempt the slower remove() based solution.
185 int from = 0;
186 int to = 0;
187
188 for (; from < list.size(); from++) {
189 T element = list.get(from);
190 if (!predicate.apply(element)) {
191 if (from > to) {
192 try {
193 list.set(to, element);
194 } catch (UnsupportedOperationException e) {
195 slowRemoveIfForRemainingElements(list, predicate, to, from);
196 return true;
197 }
198 }
199 to++;
200 }
201 }
202
203 // Clear the tail of any remaining items
204 list.subList(to, list.size()).clear();
205 return from != to;
206 }
207
208 private static <T> void slowRemoveIfForRemainingElements(List<T> list,
209 Predicate<? super T> predicate, int to, int from) {
210 // Here we know that:
211 // * (to < from) and that both are valid indices.
212 // * Everything with (index < to) should be kept.
213 // * Everything with (to <= index < from) should be removed.
214 // * The element with (index == from) should be kept.
215 // * Everything with (index > from) has not been checked yet.
216
217 // Check from the end of the list backwards (minimize expected cost of
218 // moving elements when remove() is called). Stop before 'from' because
219 // we already know that should be kept.
220 for (int n = list.size() - 1; n > from; n--) {
221 if (predicate.apply(list.get(n))) {
222 list.remove(n);
223 }
224 }
225 // And now remove everything in the range [to, from) (going backwards).
226 for (int n = from - 1; n >= to; n--) {
227 list.remove(n);
228 }
229 }
230
231 /**
232 * Removes and returns the first matching element, or returns {@code null} if there is none.
233 */
234 @Nullable
235 static <T> T removeFirstMatching(Iterable<T> removeFrom, Predicate<? super T> predicate) {
236 checkNotNull(predicate);
237 Iterator<T> iterator = removeFrom.iterator();
238 while (iterator.hasNext()) {
239 T next = iterator.next();
240 if (predicate.apply(next)) {
241 iterator.remove();
242 return next;
243 }
244 }
245 return null;
246 }
247
248 /**
249 * Determines whether two iterables contain equal elements in the same order.
250 * More specifically, this method returns {@code true} if {@code iterable1}
251 * and {@code iterable2} contain the same number of elements and every element
252 * of {@code iterable1} is equal to the corresponding element of
253 * {@code iterable2}.
254 */
255 public static boolean elementsEqual(
256 Iterable<?> iterable1, Iterable<?> iterable2) {
257 if (iterable1 instanceof Collection && iterable2 instanceof Collection) {
258 Collection<?> collection1 = (Collection<?>) iterable1;
259 Collection<?> collection2 = (Collection<?>) iterable2;
260 if (collection1.size() != collection2.size()) {
261 return false;
262 }
263 }
264 return Iterators.elementsEqual(iterable1.iterator(), iterable2.iterator());
265 }
266
267 /**
268 * Returns a string representation of {@code iterable}, with the format {@code
269 * [e1, e2, ..., en]} (that is, identical to {@link java.util.Arrays
270 * Arrays}{@code .toString(Iterables.toArray(iterable))}). Note that for
271 * <i>most</i> implementations of {@link Collection}, {@code
272 * collection.toString()} also gives the same result, but that behavior is not
273 * generally guaranteed.
274 */
275 public static String toString(Iterable<?> iterable) {
276 return Iterators.toString(iterable.iterator());
277 }
278
279 /**
280 * Returns the single element contained in {@code iterable}.
281 *
282 * @throws NoSuchElementException if the iterable is empty
283 * @throws IllegalArgumentException if the iterable contains multiple
284 * elements
285 */
286 public static <T> T getOnlyElement(Iterable<T> iterable) {
287 return Iterators.getOnlyElement(iterable.iterator());
288 }
289
290 /**
291 * Returns the single element contained in {@code iterable}, or {@code
292 * defaultValue} if the iterable is empty.
293 *
294 * @throws IllegalArgumentException if the iterator contains multiple
295 * elements
296 */
297 @Nullable
298 public static <T> T getOnlyElement(
299 Iterable<? extends T> iterable, @Nullable T defaultValue) {
300 return Iterators.getOnlyElement(iterable.iterator(), defaultValue);
301 }
302
303 /**
304 * Copies an iterable's elements into an array.
305 *
306 * @param iterable the iterable to copy
307 * @return a newly-allocated array into which all the elements of the iterable
308 * have been copied
309 */
310 static Object[] toArray(Iterable<?> iterable) {
311 return toCollection(iterable).toArray();
312 }
313
314 /**
315 * Converts an iterable into a collection. If the iterable is already a
316 * collection, it is returned. Otherwise, an {@link java.util.ArrayList} is
317 * created with the contents of the iterable in the same iteration order.
318 */
319 private static <E> Collection<E> toCollection(Iterable<E> iterable) {
320 return (iterable instanceof Collection)
321 ? (Collection<E>) iterable
322 : Lists.newArrayList(iterable.iterator());
323 }
324
325 /**
326 * Adds all elements in {@code iterable} to {@code collection}.
327 *
328 * @return {@code true} if {@code collection} was modified as a result of this
329 * operation.
330 */
331 public static <T> boolean addAll(
332 Collection<T> addTo, Iterable<? extends T> elementsToAdd) {
333 if (elementsToAdd instanceof Collection) {
334 Collection<? extends T> c = Collections2.cast(elementsToAdd);
335 return addTo.addAll(c);
336 }
337 return Iterators.addAll(addTo, checkNotNull(elementsToAdd).iterator());
338 }
339
340 /**
341 * Returns the number of elements in the specified iterable that equal the
342 * specified object. This implementation avoids a full iteration when the
343 * iterable is a {@link Multiset} or {@link Set}.
344 *
345 * @see Collections#frequency
346 */
347 public static int frequency(Iterable<?> iterable, @Nullable Object element) {
348 if ((iterable instanceof Multiset)) {
349 return ((Multiset<?>) iterable).count(element);
350 } else if ((iterable instanceof Set)) {
351 return ((Set<?>) iterable).contains(element) ? 1 : 0;
352 }
353 return Iterators.frequency(iterable.iterator(), element);
354 }
355
356 /**
357 * Returns an iterable whose iterators cycle indefinitely over the elements of
358 * {@code iterable}.
359 *
360 * <p>That iterator supports {@code remove()} if {@code iterable.iterator()}
361 * does. After {@code remove()} is called, subsequent cycles omit the removed
362 * element, which is no longer in {@code iterable}. The iterator's
363 * {@code hasNext()} method returns {@code true} until {@code iterable} is
364 * empty.
365 *
366 * <p><b>Warning:</b> Typical uses of the resulting iterator may produce an
367 * infinite loop. You should use an explicit {@code break} or be certain that
368 * you will eventually remove all the elements.
369 *
370 * <p>To cycle over the iterable {@code n} times, use the following:
371 * {@code Iterables.concat(Collections.nCopies(n, iterable))}
372 */
373 public static <T> Iterable<T> cycle(final Iterable<T> iterable) {
374 checkNotNull(iterable);
375 return new FluentIterable<T>() {
376 @Override
377 public Iterator<T> iterator() {
378 return Iterators.cycle(iterable);
379 }
380 @Override public String toString() {
381 return iterable.toString() + " (cycled)";
382 }
383 };
384 }
385
386 /**
387 * Returns an iterable whose iterators cycle indefinitely over the provided
388 * elements.
389 *
390 * <p>After {@code remove} is invoked on a generated iterator, the removed
391 * element will no longer appear in either that iterator or any other iterator
392 * created from the same source iterable. That is, this method behaves exactly
393 * as {@code Iterables.cycle(Lists.newArrayList(elements))}. The iterator's
394 * {@code hasNext} method returns {@code true} until all of the original
395 * elements have been removed.
396 *
397 * <p><b>Warning:</b> Typical uses of the resulting iterator may produce an
398 * infinite loop. You should use an explicit {@code break} or be certain that
399 * you will eventually remove all the elements.
400 *
401 * <p>To cycle over the elements {@code n} times, use the following:
402 * {@code Iterables.concat(Collections.nCopies(n, Arrays.asList(elements)))}
403 */
404 public static <T> Iterable<T> cycle(T... elements) {
405 return cycle(Lists.newArrayList(elements));
406 }
407
408 /**
409 * Combines two iterables into a single iterable. The returned iterable has an
410 * iterator that traverses the elements in {@code a}, followed by the elements
411 * in {@code b}. The source iterators are not polled until necessary.
412 *
413 * <p>The returned iterable's iterator supports {@code remove()} when the
414 * corresponding input iterator supports it.
415 */
416 public static <T> Iterable<T> concat(
417 Iterable<? extends T> a, Iterable<? extends T> b) {
418 return concat(ImmutableList.of(a, b));
419 }
420
421 /**
422 * Combines three iterables into a single iterable. The returned iterable has
423 * an iterator that traverses the elements in {@code a}, followed by the
424 * elements in {@code b}, followed by the elements in {@code c}. The source
425 * iterators are not polled until necessary.
426 *
427 * <p>The returned iterable's iterator supports {@code remove()} when the
428 * corresponding input iterator supports it.
429 */
430 public static <T> Iterable<T> concat(Iterable<? extends T> a,
431 Iterable<? extends T> b, Iterable<? extends T> c) {
432 return concat(ImmutableList.of(a, b, c));
433 }
434
435 /**
436 * Combines four iterables into a single iterable. The returned iterable has
437 * an iterator that traverses the elements in {@code a}, followed by the
438 * elements in {@code b}, followed by the elements in {@code c}, followed by
439 * the elements in {@code d}. The source iterators are not polled until
440 * necessary.
441 *
442 * <p>The returned iterable's iterator supports {@code remove()} when the
443 * corresponding input iterator supports it.
444 */
445 public static <T> Iterable<T> concat(Iterable<? extends T> a,
446 Iterable<? extends T> b, Iterable<? extends T> c,
447 Iterable<? extends T> d) {
448 return concat(ImmutableList.of(a, b, c, d));
449 }
450
451 /**
452 * Combines multiple iterables into a single iterable. The returned iterable
453 * has an iterator that traverses the elements of each iterable in
454 * {@code inputs}. The input iterators are not polled until necessary.
455 *
456 * <p>The returned iterable's iterator supports {@code remove()} when the
457 * corresponding input iterator supports it.
458 *
459 * @throws NullPointerException if any of the provided iterables is null
460 */
461 public static <T> Iterable<T> concat(Iterable<? extends T>... inputs) {
462 return concat(ImmutableList.copyOf(inputs));
463 }
464
465 /**
466 * Combines multiple iterables into a single iterable. The returned iterable
467 * has an iterator that traverses the elements of each iterable in
468 * {@code inputs}. The input iterators are not polled until necessary.
469 *
470 * <p>The returned iterable's iterator supports {@code remove()} when the
471 * corresponding input iterator supports it. The methods of the returned
472 * iterable may throw {@code NullPointerException} if any of the input
473 * iterators is null.
474 */
475 public static <T> Iterable<T> concat(
476 final Iterable<? extends Iterable<? extends T>> inputs) {
477 checkNotNull(inputs);
478 return new FluentIterable<T>() {
479 @Override
480 public Iterator<T> iterator() {
481 return Iterators.concat(iterators(inputs));
482 }
483 };
484 }
485
486 /**
487 * Returns an iterator over the iterators of the given iterables.
488 */
489 private static <T> Iterator<Iterator<? extends T>> iterators(
490 Iterable<? extends Iterable<? extends T>> iterables) {
491 return new TransformedIterator<Iterable<? extends T>, Iterator<? extends T>>(
492 iterables.iterator()) {
493 @Override
494 Iterator<? extends T> transform(Iterable<? extends T> from) {
495 return from.iterator();
496 }
497 };
498 }
499
500 /**
501 * Divides an iterable into unmodifiable sublists of the given size (the final
502 * iterable may be smaller). For example, partitioning an iterable containing
503 * {@code [a, b, c, d, e]} with a partition size of 3 yields {@code
504 * [[a, b, c], [d, e]]} -- an outer iterable containing two inner lists of
505 * three and two elements, all in the original order.
506 *
507 * <p>Iterators returned by the returned iterable do not support the {@link
508 * Iterator#remove()} method. The returned lists implement {@link
509 * RandomAccess}, whether or not the input list does.
510 *
511 * <p><b>Note:</b> if {@code iterable} is a {@link List}, use {@link
512 * Lists#partition(List, int)} instead.
513 *
514 * @param iterable the iterable to return a partitioned view of
515 * @param size the desired size of each partition (the last may be smaller)
516 * @return an iterable of unmodifiable lists containing the elements of {@code
517 * iterable} divided into partitions
518 * @throws IllegalArgumentException if {@code size} is nonpositive
519 */
520 public static <T> Iterable<List<T>> partition(
521 final Iterable<T> iterable, final int size) {
522 checkNotNull(iterable);
523 checkArgument(size > 0);
524 return new FluentIterable<List<T>>() {
525 @Override
526 public Iterator<List<T>> iterator() {
527 return Iterators.partition(iterable.iterator(), size);
528 }
529 };
530 }
531
532 /**
533 * Divides an iterable into unmodifiable sublists of the given size, padding
534 * the final iterable with null values if necessary. For example, partitioning
535 * an iterable containing {@code [a, b, c, d, e]} with a partition size of 3
536 * yields {@code [[a, b, c], [d, e, null]]} -- an outer iterable containing
537 * two inner lists of three elements each, all in the original order.
538 *
539 * <p>Iterators returned by the returned iterable do not support the {@link
540 * Iterator#remove()} method.
541 *
542 * @param iterable the iterable to return a partitioned view of
543 * @param size the desired size of each partition
544 * @return an iterable of unmodifiable lists containing the elements of {@code
545 * iterable} divided into partitions (the final iterable may have
546 * trailing null elements)
547 * @throws IllegalArgumentException if {@code size} is nonpositive
548 */
549 public static <T> Iterable<List<T>> paddedPartition(
550 final Iterable<T> iterable, final int size) {
551 checkNotNull(iterable);
552 checkArgument(size > 0);
553 return new FluentIterable<List<T>>() {
554 @Override
555 public Iterator<List<T>> iterator() {
556 return Iterators.paddedPartition(iterable.iterator(), size);
557 }
558 };
559 }
560
561 /**
562 * Returns the elements of {@code unfiltered} that satisfy a predicate. The
563 * resulting iterable's iterator does not support {@code remove()}.
564 */
565 public static <T> Iterable<T> filter(
566 final Iterable<T> unfiltered, final Predicate<? super T> predicate) {
567 checkNotNull(unfiltered);
568 checkNotNull(predicate);
569 return new FluentIterable<T>() {
570 @Override
571 public Iterator<T> iterator() {
572 return Iterators.filter(unfiltered.iterator(), predicate);
573 }
574 };
575 }
576
577 /**
578 * Returns {@code true} if any element in {@code iterable} satisfies the predicate.
579 */
580 public static <T> boolean any(
581 Iterable<T> iterable, Predicate<? super T> predicate) {
582 return Iterators.any(iterable.iterator(), predicate);
583 }
584
585 /**
586 * Returns {@code true} if every element in {@code iterable} satisfies the
587 * predicate. If {@code iterable} is empty, {@code true} is returned.
588 */
589 public static <T> boolean all(
590 Iterable<T> iterable, Predicate<? super T> predicate) {
591 return Iterators.all(iterable.iterator(), predicate);
592 }
593
594 /**
595 * Returns the first element in {@code iterable} that satisfies the given
596 * predicate; use this method only when such an element is known to exist. If
597 * it is possible that <i>no</i> element will match, use {@link #tryFind} or
598 * {@link #find(Iterable, Predicate, Object)} instead.
599 *
600 * @throws NoSuchElementException if no element in {@code iterable} matches
601 * the given predicate
602 */
603 public static <T> T find(Iterable<T> iterable,
604 Predicate<? super T> predicate) {
605 return Iterators.find(iterable.iterator(), predicate);
606 }
607
608 /**
609 * Returns the first element in {@code iterable} that satisfies the given
610 * predicate, or {@code defaultValue} if none found. Note that this can
611 * usually be handled more naturally using {@code
612 * tryFind(iterable, predicate).or(defaultValue)}.
613 *
614 * @since 7.0
615 */
616 @Nullable
617 public static <T> T find(Iterable<? extends T> iterable,
618 Predicate<? super T> predicate, @Nullable T defaultValue) {
619 return Iterators.find(iterable.iterator(), predicate, defaultValue);
620 }
621
622 /**
623 * Returns an {@link Optional} containing the first element in {@code
624 * iterable} that satisfies the given predicate, if such an element exists.
625 *
626 * <p><b>Warning:</b> avoid using a {@code predicate} that matches {@code
627 * null}. If {@code null} is matched in {@code iterable}, a
628 * NullPointerException will be thrown.
629 *
630 * @since 11.0
631 */
632 public static <T> Optional<T> tryFind(Iterable<T> iterable,
633 Predicate<? super T> predicate) {
634 return Iterators.tryFind(iterable.iterator(), predicate);
635 }
636
637 /**
638 * Returns the index in {@code iterable} of the first element that satisfies
639 * the provided {@code predicate}, or {@code -1} if the Iterable has no such
640 * elements.
641 *
642 * <p>More formally, returns the lowest index {@code i} such that
643 * {@code predicate.apply(Iterables.get(iterable, i))} returns {@code true},
644 * or {@code -1} if there is no such index.
645 *
646 * @since 2.0
647 */
648 public static <T> int indexOf(
649 Iterable<T> iterable, Predicate<? super T> predicate) {
650 return Iterators.indexOf(iterable.iterator(), predicate);
651 }
652
653 /**
654 * Returns an iterable that applies {@code function} to each element of {@code
655 * fromIterable}.
656 *
657 * <p>The returned iterable's iterator supports {@code remove()} if the
658 * provided iterator does. After a successful {@code remove()} call,
659 * {@code fromIterable} no longer contains the corresponding element.
660 *
661 * <p>If the input {@code Iterable} is known to be a {@code List} or other
662 * {@code Collection}, consider {@link Lists#transform} and {@link
663 * Collections2#transform}.
664 */
665 public static <F, T> Iterable<T> transform(final Iterable<F> fromIterable,
666 final Function<? super F, ? extends T> function) {
667 checkNotNull(fromIterable);
668 checkNotNull(function);
669 return new FluentIterable<T>() {
670 @Override
671 public Iterator<T> iterator() {
672 return Iterators.transform(fromIterable.iterator(), function);
673 }
674 };
675 }
676
677 /**
678 * Returns the element at the specified position in an iterable.
679 *
680 * @param position position of the element to return
681 * @return the element at the specified position in {@code iterable}
682 * @throws IndexOutOfBoundsException if {@code position} is negative or
683 * greater than or equal to the size of {@code iterable}
684 */
685 public static <T> T get(Iterable<T> iterable, int position) {
686 checkNotNull(iterable);
687 return (iterable instanceof List)
688 ? ((List<T>) iterable).get(position)
689 : Iterators.get(iterable.iterator(), position);
690 }
691
692 /**
693 * Returns the element at the specified position in an iterable or a default
694 * value otherwise.
695 *
696 * @param position position of the element to return
697 * @param defaultValue the default value to return if {@code position} is
698 * greater than or equal to the size of the iterable
699 * @return the element at the specified position in {@code iterable} or
700 * {@code defaultValue} if {@code iterable} contains fewer than
701 * {@code position + 1} elements.
702 * @throws IndexOutOfBoundsException if {@code position} is negative
703 * @since 4.0
704 */
705 @Nullable
706 public static <T> T get(Iterable<? extends T> iterable, int position, @Nullable T defaultValue) {
707 checkNotNull(iterable);
708 Iterators.checkNonnegative(position);
709 if (iterable instanceof List) {
710 List<? extends T> list = Lists.cast(iterable);
711 return (position < list.size()) ? list.get(position) : defaultValue;
712 } else {
713 Iterator<? extends T> iterator = iterable.iterator();
714 Iterators.advance(iterator, position);
715 return Iterators.getNext(iterator, defaultValue);
716 }
717 }
718
719 /**
720 * Returns the first element in {@code iterable} or {@code defaultValue} if
721 * the iterable is empty. The {@link Iterators} analog to this method is
722 * {@link Iterators#getNext}.
723 *
724 * <p>If no default value is desired (and the caller instead wants a
725 * {@link NoSuchElementException} to be thrown), it is recommended that
726 * {@code iterable.iterator().next()} is used instead.
727 *
728 * @param defaultValue the default value to return if the iterable is empty
729 * @return the first element of {@code iterable} or the default value
730 * @since 7.0
731 */
732 @Nullable
733 public static <T> T getFirst(Iterable<? extends T> iterable, @Nullable T defaultValue) {
734 return Iterators.getNext(iterable.iterator(), defaultValue);
735 }
736
737 /**
738 * Returns the last element of {@code iterable}.
739 *
740 * @return the last element of {@code iterable}
741 * @throws NoSuchElementException if the iterable is empty
742 */
743 public static <T> T getLast(Iterable<T> iterable) {
744 // TODO(kevinb): Support a concurrently modified collection?
745 if (iterable instanceof List) {
746 List<T> list = (List<T>) iterable;
747 if (list.isEmpty()) {
748 throw new NoSuchElementException();
749 }
750 return getLastInNonemptyList(list);
751 }
752
753 return Iterators.getLast(iterable.iterator());
754 }
755
756 /**
757 * Returns the last element of {@code iterable} or {@code defaultValue} if
758 * the iterable is empty.
759 *
760 * @param defaultValue the value to return if {@code iterable} is empty
761 * @return the last element of {@code iterable} or the default value
762 * @since 3.0
763 */
764 @Nullable
765 public static <T> T getLast(Iterable<? extends T> iterable, @Nullable T defaultValue) {
766 if (iterable instanceof Collection) {
767 Collection<? extends T> c = Collections2.cast(iterable);
768 if (c.isEmpty()) {
769 return defaultValue;
770 } else if (iterable instanceof List) {
771 return getLastInNonemptyList(Lists.cast(iterable));
772 }
773 }
774
775 return Iterators.getLast(iterable.iterator(), defaultValue);
776 }
777
778 private static <T> T getLastInNonemptyList(List<T> list) {
779 return list.get(list.size() - 1);
780 }
781
782 /**
783 * Returns a view of {@code iterable} that skips its first
784 * {@code numberToSkip} elements. If {@code iterable} contains fewer than
785 * {@code numberToSkip} elements, the returned iterable skips all of its
786 * elements.
787 *
788 * <p>Modifications to the underlying {@link Iterable} before a call to
789 * {@code iterator()} are reflected in the returned iterator. That is, the
790 * iterator skips the first {@code numberToSkip} elements that exist when the
791 * {@code Iterator} is created, not when {@code skip()} is called.
792 *
793 * <p>The returned iterable's iterator supports {@code remove()} if the
794 * iterator of the underlying iterable supports it. Note that it is
795 * <i>not</i> possible to delete the last skipped element by immediately
796 * calling {@code remove()} on that iterator, as the {@code Iterator}
797 * contract states that a call to {@code remove()} before a call to
798 * {@code next()} will throw an {@link IllegalStateException}.
799 *
800 * @since 3.0
801 */
802 public static <T> Iterable<T> skip(final Iterable<T> iterable,
803 final int numberToSkip) {
804 checkNotNull(iterable);
805 checkArgument(numberToSkip >= 0, "number to skip cannot be negative");
806
807 if (iterable instanceof List) {
808 final List<T> list = (List<T>) iterable;
809 return new FluentIterable<T>() {
810 @Override
811 public Iterator<T> iterator() {
812 // TODO(kevinb): Support a concurrently modified collection?
813 int toSkip = Math.min(list.size(), numberToSkip);
814 return list.subList(toSkip, list.size()).iterator();
815 }
816 };
817 }
818
819 return new FluentIterable<T>() {
820 @Override
821 public Iterator<T> iterator() {
822 final Iterator<T> iterator = iterable.iterator();
823
824 Iterators.advance(iterator, numberToSkip);
825
826 /*
827 * We can't just return the iterator because an immediate call to its
828 * remove() method would remove one of the skipped elements instead of
829 * throwing an IllegalStateException.
830 */
831 return new Iterator<T>() {
832 boolean atStart = true;
833
834 @Override
835 public boolean hasNext() {
836 return iterator.hasNext();
837 }
838
839 @Override
840 public T next() {
841 T result = iterator.next();
842 atStart = false; // not called if next() fails
843 return result;
844 }
845
846 @Override
847 public void remove() {
848 checkRemove(!atStart);
849 iterator.remove();
850 }
851 };
852 }
853 };
854 }
855
856 /**
857 * Creates an iterable with the first {@code limitSize} elements of the given
858 * iterable. If the original iterable does not contain that many elements, the
859 * returned iterable will have the same behavior as the original iterable. The
860 * returned iterable's iterator supports {@code remove()} if the original
861 * iterator does.
862 *
863 * @param iterable the iterable to limit
864 * @param limitSize the maximum number of elements in the returned iterable
865 * @throws IllegalArgumentException if {@code limitSize} is negative
866 * @since 3.0
867 */
868 public static <T> Iterable<T> limit(
869 final Iterable<T> iterable, final int limitSize) {
870 checkNotNull(iterable);
871 checkArgument(limitSize >= 0, "limit is negative");
872 return new FluentIterable<T>() {
873 @Override
874 public Iterator<T> iterator() {
875 return Iterators.limit(iterable.iterator(), limitSize);
876 }
877 };
878 }
879
880 /**
881 * Returns a view of the supplied iterable that wraps each generated
882 * {@link Iterator} through {@link Iterators#consumingIterator(Iterator)}.
883 *
884 * <p>Note: If {@code iterable} is a {@link Queue}, the returned iterable will
885 * get entries from {@link Queue#remove()} since {@link Queue}'s iteration
886 * order is undefined. Calling {@link Iterator#hasNext()} on a generated
887 * iterator from the returned iterable may cause an item to be immediately
888 * dequeued for return on a subsequent call to {@link Iterator#next()}.
889 *
890 * @param iterable the iterable to wrap
891 * @return a view of the supplied iterable that wraps each generated iterator
892 * through {@link Iterators#consumingIterator(Iterator)}; for queues,
893 * an iterable that generates iterators that return and consume the
894 * queue's elements in queue order
895 *
896 * @see Iterators#consumingIterator(Iterator)
897 * @since 2.0
898 */
899 public static <T> Iterable<T> consumingIterable(final Iterable<T> iterable) {
900 if (iterable instanceof Queue) {
901 return new FluentIterable<T>() {
902 @Override
903 public Iterator<T> iterator() {
904 return new ConsumingQueueIterator<T>((Queue<T>) iterable);
905 }
906
907 @Override
908 public String toString() {
909 return "Iterables.consumingIterable(...)";
910 }
911 };
912 }
913
914 checkNotNull(iterable);
915
916 return new FluentIterable<T>() {
917 @Override
918 public Iterator<T> iterator() {
919 return Iterators.consumingIterator(iterable.iterator());
920 }
921
922 @Override
923 public String toString() {
924 return "Iterables.consumingIterable(...)";
925 }
926 };
927 }
928
929 private static class ConsumingQueueIterator<T> extends AbstractIterator<T> {
930 private final Queue<T> queue;
931
932 private ConsumingQueueIterator(Queue<T> queue) {
933 this.queue = queue;
934 }
935
936 @Override public T computeNext() {
937 try {
938 return queue.remove();
939 } catch (NoSuchElementException e) {
940 return endOfData();
941 }
942 }
943 }
944
945 // Methods only in Iterables, not in Iterators
946
947 /**
948 * Determines if the given iterable contains no elements.
949 *
950 * <p>There is no precise {@link Iterator} equivalent to this method, since
951 * one can only ask an iterator whether it has any elements <i>remaining</i>
952 * (which one does using {@link Iterator#hasNext}).
953 *
954 * @return {@code true} if the iterable contains no elements
955 */
956 public static boolean isEmpty(Iterable<?> iterable) {
957 if (iterable instanceof Collection) {
958 return ((Collection<?>) iterable).isEmpty();
959 }
960 return !iterable.iterator().hasNext();
961 }
962
963 /**
964 * Returns an iterable over the merged contents of all given
965 * {@code iterables}. Equivalent entries will not be de-duplicated.
966 *
967 * <p>Callers must ensure that the source {@code iterables} are in
968 * non-descending order as this method does not sort its input.
969 *
970 * <p>For any equivalent elements across all {@code iterables}, it is
971 * undefined which element is returned first.
972 *
973 * @since 11.0
974 */
975 @Beta
976 public static <T> Iterable<T> mergeSorted(
977 final Iterable<? extends Iterable<? extends T>> iterables,
978 final Comparator<? super T> comparator) {
979 checkNotNull(iterables, "iterables");
980 checkNotNull(comparator, "comparator");
981 Iterable<T> iterable = new FluentIterable<T>() {
982 @Override
983 public Iterator<T> iterator() {
984 return Iterators.mergeSorted(
985 Iterables.transform(iterables, Iterables.<T>toIterator()),
986 comparator);
987 }
988 };
989 return new UnmodifiableIterable<T>(iterable);
990 }
991
992 // TODO(user): Is this the best place for this? Move to fluent functions?
993 // Useful as a public method?
994 private static <T> Function<Iterable<? extends T>, Iterator<? extends T>>
995 toIterator() {
996 return new Function<Iterable<? extends T>, Iterator<? extends T>>() {
997 @Override
998 public Iterator<? extends T> apply(Iterable<? extends T> iterable) {
999 return iterable.iterator();
1000 }
1001 };
1002 }
1003 }